//
//  main.m
//  OC的block
//
//  Created by hyl on 16/4/3.
//  Copyright © 2016年 hyl. All rights reserved.
//

#import <Foundation/Foundation.h>

int caculate(int(^caculate)(int,int),int a,int b)
{
    return caculate(a,b);
}

int main(int argc, const char * argv[]) {
//    oc中的block基于c实限
//    函数批针如果懂的话，应很好理解
//    首先来个对比
//    void (*func)();
//    void (*block)();
//    第一返回类型可以手动申明，或者由编译器推导
//    第二是具有参数类型的参数列表
//    拥有名称
//    用加减方法来做个实现
//
//    int (^sumBlock)(int,int);
//    sumBlock=^(int value1,int value2){
//        return value1+value2;
//    };
//    int (^minusBlock)(int,int);
//    minusBlock=^(int value1,int value2){
//        return value1-value2;
//    };
    
//  上面的写法可以这样来，会更简洁
    typedef int (^caculateBlock) (int,int);//定义一种数据类型
    caculateBlock sumBlock=^(int value1,int value2){
        return value1+value2;
    };
//    sumBlock(10,20);
//    NSLog(@"%i",sumBlock(10,20));
    
    
//    当然block作为一种数据类型，当然就会数据类型的特性
//    能定义变量，能作为参数，能作为返回值
//    实际的应用场景中，后两者居多
//    重写加减法, 代码在main外面
//    caculate(sumBlock, 10,40);
    NSLog(@"%i",caculate(^(int a,int b){return a+b;}, 10, 49));
    NSLog(@"%i",caculate(sumBlock, 10,40));
    
//    作为返回值，如果有js代码经验的话，就是返回一个函数，执行的时候加个（）
    return 0;
}

int sum(int value1,int value2)
{
    return value2+value1;
}

